package aerolineasYVuelos

import scala.collection.mutable.Buffer
import javax.persistence.Entity
import javax.persistence.Id
import javax.persistence.OneToMany
import java.util.Date
import javax.persistence.GenerationType
import javax.persistence.GeneratedValue
import javax.persistence.JoinColumn
import org.hibernate.annotations.Fetch
import org.hibernate.annotations.FetchMode
import primeraEntregaMain.Usuario
import servicios.ServicioAsiento
import servicios.ServicioUsuario
import javax.persistence.CascadeType
import scala.collection.JavaConverters._
import scala.collection.JavaConversions._
import java.sql.Time

@Entity
class Tramo{
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	var id: Int = _
	def getId = id
    def setId(i: Int) { id = i } 
	
	var origen: String = _
	def getOrigen = origen
	def setOrigen(s: String) { origen = s }
	
	var destino: String = _
	def getDestino = destino
	def setDestino(s: String) { destino = s }
	
	var horaSalida: Date = _
	def getHoraSalida = horaSalida
	def setHoraSalida(hora: Date) { horaSalida = hora }
	
	var horaLlegada: Date = _
	def getHoraLlegada = horaLlegada
	def setHoraLlegada(hora: Date) { horaLlegada = hora }
	
	@OneToMany(mappedBy = "tramo", cascade = Array(CascadeType.ALL))
	@Fetch(value = FetchMode.SUBSELECT)
	var asientos: java.util.List[Asiento] = new java.util.ArrayList[Asiento]
	def getAsientos = asientos
	def setAsientos(a: java.util.List[Asiento]) { 
		asientos = a
		asientos.foreach(_.setTramo(this))
	  }
	
	var precioBase: Int = _
	def getPrecioBase = precioBase
	def setPrecioBase(n: Int) { precioBase = n }
	
	def this(origen: String, destino: String, horaSalida: Time, horaLlegada: Time, precio: Int, asientos: Buffer[Asiento]) {
		this
	  	setOrigen(origen)
		setDestino(destino)
		setHoraSalida(horaSalida)
		setHoraLlegada(horaLlegada)
		setPrecioBase(precio)
		setAsientos(asientos)
	}
	
	def calcularPrecio(asiento: Asiento) {
		asiento.calcularPrecioPorCategoria(getPrecioBase)
	}
	
	def consultarAsientosLibres {
		ServicioAsiento.asientosDisponibles(this)
	}
}
